extension ListExtension<T> on List<T> {
  // 判空
  bool get isNullOrEmpty => isEmpty;
  bool get isNotNullOrEmpty => isNotEmpty;

  // 安全获取
  T? getOrNull(int index) {
    if (index < 0 || index >= length) return null;
    return this[index];
  }

  // 分组
  Map<K, List<T>> groupBy<K>(K Function(T) keyFunction) {
    final map = <K, List<T>>{};
    for (var element in this) {
      final key = keyFunction(element);
      if (!map.containsKey(key)) {
        map[key] = [];
      }
      map[key]!.add(element);
    }
    return map;
  }

  // 去重
  List<T> distinct() {
    return toSet().toList();
  }

  // 随机打乱
  List<T> shuffle() {
    final list = List<T>.from(this);
    list.shuffle();
    return list;
  }

  // 取最后n个元素
  List<T> takeLast(int n) {
    if (n > length) return this;
    return sublist(length - n);
  }
}
